////////////////////////////////////////////////////////////////////////////////
//
//                        Borland Delphi Runtime Library
//                     Object Picker Dialog interface unit
//
// Portions created by Microsoft are
// Copyright (c) 1994 - 1999, Microsoft Corporation
// All Rights Reserved.
//
// The original file is: objsel.h, released 2003-03-26.
// The original Pascal code is: ObjSel.pas, released 2004-07-11.
// The initial developer of the Pascal code is: Nico Bendlin <nicode@gmx.net>.
//
// Portions created by Nico Bendlin are
// Copyright (c) 2004 Nico Bendlin.
//
// The contents of this file are used with permission, subject to the Mozilla
// Public License Version 1.1 (the "License"); you may not use this file except
// in compliance with the License. You may obtain a copy of the License at
// http://www.mozilla.org/MPL/MPL-1.1.html
//
// Software distributed under the License is distributed on an "AS IS" basis,
// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
// the specific language governing rights and limitations under the License.
//
// Alternatively, the contents of this file may be used under the terms of
// either the GNU General Public License Version 2 or later (the "GPL"), or
// the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
// in which case the provisions of the GPL or the LGPL are applicable instead
// of those above. If you wish to allow use of your version of this file only
// under the terms of either the GPL or the LGPL, and not to allow others to
// use your version of this file under the terms of the MPL, indicate your
// decision by deleting the provisions above and replace them with the notice
// and other provisions required by the GPL or the LGPL. If you do not delete
// the provisions above, a recipient may use your version of this file under
// the terms of any one of the MPL, the GPL or the LGPL.
//
////////////////////////////////////////////////////////////////////////////////

{$WEAKPACKAGEUNIT}

unit ObjSel;


interface


uses
  Windows, ActiveX;

//FIXME: [NicoDE] missing type declarations in Windows.pas
type
  PWSTR = PWideChar;
  PCWSTR = PWideChar;  // const


const
  CLSID_DsObjectPicker: TGUID = '{17D6CCD8-3B7B-11D2-B9E0-00C04FD8DBF7}';

const
  IID_IDsObjectPicker: TGUID = '{0c87e64e-3b7a-11d2-b9e0-00c04fd8dbf7}';


//
//
// CLIPBOARD FORMATS
// =================
//
// CFSTR_DSOP_DS_SELECTION_LIST
//     Returns an HGLOBAL for global memory containing a DS_SELECTION_LIST
//     variable length structure.
//

const
  CFSTR_DSOP_DS_SELECTION_LIST = 'CFSTR_DSOP_DS_SELECTION_LIST';


//
// SCOPE TYPES
// ===========
//
// A scope is an entry in the "Look In" dropdown list of the Object Picker
// dialog.
//
// When initializing the DS Object Picker, DSOP_SCOPE_TYPEs are used with
// DSOP_SCOPE_INIT_INFO.flType member to specify which types of scopes the
// DS Object Picker should put in the "Look In" list.
//
// DSOP_SCOPE_TYPE_TARGET_COMPUTER
//     Computer specified by DSOP_INIT_INFO.pwzTargetComputer, NULL is
//     local computer.
//
// DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN
//     Uplevel domain to which target computer is joined.
//
// DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN
//     Downlevel domain to which target computer is joined.
//
// DSOP_SCOPE_TYPE_ENTERPRISE_DOMAIN
//     All domains in the enterprise to which the target computer belongs
//     other than the JOINED_DOMAIN or USER_SPECIFIED_*_SCOPEs.
//
// DSOP_SCOPE_TYPE_GLOBAL_CATALOG
//     The Entire Directory scope.
//
// DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN
//     All uplevel domains external to the enterprise but trusted by the
//     domain to which the target computer is joined.
//
// DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN
//     All downlevel domains external to the enterprise but trusted by the
//     domain to which the target computer is joined.
//
// DSOP_SCOPE_TYPE_WORKGROUP
//     The workgroup of which TARGET_COMPUTER is a member.  Applies only if the
//     TARGET_COMPUTER is not joined to a domain.
//
// DSOP_SCOPE_TYPE_USER_ENTERED_UPLEVEL_SCOPE
// DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE
//     Any uplevel or downlevel scope generated by processing user input.  If
//     neither of these types is specified, user entries that do not refer to
//     one of the scopes in the "Look In" control will be rejected.
//

const
  DSOP_SCOPE_TYPE_TARGET_COMPUTER              = $00000001;
  DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN        = $00000002;
  DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN      = $00000004;
  DSOP_SCOPE_TYPE_ENTERPRISE_DOMAIN            = $00000008;
  DSOP_SCOPE_TYPE_GLOBAL_CATALOG               = $00000010;
  DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN      = $00000020;
  DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN    = $00000040;
  DSOP_SCOPE_TYPE_WORKGROUP                    = $00000080;
  DSOP_SCOPE_TYPE_USER_ENTERED_UPLEVEL_SCOPE   = $00000100;
  DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE = $00000200;


//
// DSOP_SCOPE_INIT_INFO flags
// ==========================
//
// The flScope member can contain zero or more of the following flags:
//
// DSOP_SCOPE_FLAG_STARTING_SCOPE
//     The scope should be the first one selected in the Look In control after
//     dialog initialization.  If more than one scope specifies this flag,
//     the one which is chosen to be the starting scope is implementation
//     dependant.
//
// DSOP_SCOPE_FLAG_WANT_PROVIDER_WINNT
//     ADs paths for objects selected from this scope should be converted to use
//     the WinNT provider.
//
// DSOP_SCOPE_FLAG_WANT_PROVIDER_LDAP
//     ADs paths for objects selected from this scope should be converted to use
//     the LDAP provider.
//
// DSOP_SCOPE_FLAG_WANT_PROVIDER_GC
//     ADs paths for objects selected from this scope should be converted to use
//     the GC provider.
//
// DSOP_SCOPE_FLAG_WANT_SID_PATH
//     ADs paths for objects selected from this scope having an objectSid
//     attribute should be converted to the form LDAP://<SID=x>, where x
//     represents the hexidecimal digits of the objectSid attribute value.
//
// DSOP_SCOPE_FLAG_WANT_DOWNLEVEL_BUILTIN_PATH
//     ADs paths for downlevel well-known SID objects (for example,
//     DSOP_DOWNLEVEL_FILTER_INTERACTIVE) are an empty string unless this flag is
//     specified.  If it is, the paths will be of the form
//     WinNT://NT AUTHORITY/Interactive or WinNT://Creator owner.
//
// DSOP_SCOPE_FLAG_DEFAULT_FILTER_USERS
//     If the scope filter contains the DSOP_FILTER_USERS or
//     DSOP_DOWNLEVEL_FILTER_USERS flag, then check the Users checkbox by
//     default in the Look For dialog.
//
// DSOP_SCOPE_FLAG_DEFAULT_FILTER_GROUPS
//
//
// DSOP_SCOPE_FLAG_DEFAULT_FILTER_COMPUTERS
//
// DSOP_SCOPE_FLAG_DEFAULT_FILTER_CONTACTS
//

const
  DSOP_SCOPE_FLAG_STARTING_SCOPE              = $00000001;
  DSOP_SCOPE_FLAG_WANT_PROVIDER_WINNT         = $00000002;
  DSOP_SCOPE_FLAG_WANT_PROVIDER_LDAP          = $00000004;
  DSOP_SCOPE_FLAG_WANT_PROVIDER_GC            = $00000008;
  DSOP_SCOPE_FLAG_WANT_SID_PATH               = $00000010;
  DSOP_SCOPE_FLAG_WANT_DOWNLEVEL_BUILTIN_PATH = $00000020;
  DSOP_SCOPE_FLAG_DEFAULT_FILTER_USERS        = $00000040;
  DSOP_SCOPE_FLAG_DEFAULT_FILTER_GROUPS       = $00000080;
  DSOP_SCOPE_FLAG_DEFAULT_FILTER_COMPUTERS    = $00000100;
  DSOP_SCOPE_FLAG_DEFAULT_FILTER_CONTACTS     = $00000200;


//
// The flMixedModeOnly/flNativeModeOnly member of an uplevel scope can
// contain one or more of the following flags (at least one must be specified):
//
// DSOP_FILTER_INCLUDE_ADVANCED_VIEW
//     Include objects which have the attribute showInAdvancedViewOnly set to
//     true.
//
// DSOP_FILTER_USERS
//     Include user objects.
//
// DSOP_FILTER_BUILTIN_GROUPS
//     Include group objects with a groupType value having the flag
//     GROUP_TYPE_BUILTIN_LOCAL_GROUP.
//
// DSOP_FILTER_WELL_KNOWN_PRINCIPALS
//     Include the contents of the WellKnown Security Principals container.
//
// DSOP_FILTER_UNIVERSAL_GROUPS_DL
//     Include distribution list universal groups.
//
// DSOP_FILTER_UNIVERSAL_GROUPS_SE
//     Include security enabled universal groups.
//
// DSOP_FILTER_GLOBAL_GROUPS_DL
//     Include distribution list global groups.
//
// DSOP_FILTER_GLOBAL_GROUPS_SE
//     Include security enabled global groups.
//
// DSOP_FILTER_DOMAIN_LOCAL_GROUPS_DL
//     Include distribution list domain global groups.
//
// DSOP_FILTER_DOMAIN_LOCAL_GROUPS_SE
//     Include security enabled domain local groups.
//
// DSOP_FILTER_CONTACTS
//     Include contact objects.
//
// DSOP_FILTER_COMPUTERS
//     Include computer objects.
//

const
  DSOP_FILTER_INCLUDE_ADVANCED_VIEW  = $00000001;
  DSOP_FILTER_USERS                  = $00000002;
  DSOP_FILTER_BUILTIN_GROUPS         = $00000004;
  DSOP_FILTER_WELL_KNOWN_PRINCIPALS  = $00000008;
  DSOP_FILTER_UNIVERSAL_GROUPS_DL    = $00000010;
  DSOP_FILTER_UNIVERSAL_GROUPS_SE    = $00000020;
  DSOP_FILTER_GLOBAL_GROUPS_DL       = $00000040;
  DSOP_FILTER_GLOBAL_GROUPS_SE       = $00000080;
  DSOP_FILTER_DOMAIN_LOCAL_GROUPS_DL = $00000100;
  DSOP_FILTER_DOMAIN_LOCAL_GROUPS_SE = $00000200;
  DSOP_FILTER_CONTACTS               = $00000400;
  DSOP_FILTER_COMPUTERS              = $00000800;


//
// The flFilter member of a downlevel scope can contain one or more of the
// following flags:
//
// DSOP_DOWNLEVEL_FILTER_USERS
//     Include user objects.
//
// DSOP_DOWNLEVEL_FILTER_LOCAL_GROUPS
//     Include all local groups.
//
// DSOP_DOWNLEVEL_FILTER_GLOBAL_GROUPS
//     Include all global groups.
//
// DSOP_DOWNLEVEL_FILTER_COMPUTERS
//     Include computer objects
//
// DSOP_DOWNLEVEL_FILTER_WORLD
//     Include builtin security principal World (Everyone).
//
// DSOP_DOWNLEVEL_FILTER_AUTHENTICATED_USER
//     Include builtin security principal Authenticated User.
//
// DSOP_DOWNLEVEL_FILTER_ANONYMOUS
//     Include builtin security principal Anonymous.
//
// DSOP_DOWNLEVEL_FILTER_BATCH
//     Include builtin security principal Batch.
//
// DSOP_DOWNLEVEL_FILTER_CREATOR_OWNER
//     Include builtin security principal Creator Owner.
//
// DSOP_DOWNLEVEL_FILTER_CREATOR_GROUP
//     Include builtin security principal Creator Group.
//
// DSOP_DOWNLEVEL_FILTER_DIALUP
//     Include builtin security principal Dialup.
//
// DSOP_DOWNLEVEL_FILTER_INTERACTIVE
//     Include builtin security principal Interactive.
//
// DSOP_DOWNLEVEL_FILTER_NETWORK
//     Include builtin security principal Network.
//
// DSOP_DOWNLEVEL_FILTER_SERVICE
//     Include builtin security principal Service.
//
// DSOP_DOWNLEVEL_FILTER_SYSTEM
//     Include builtin security principal System.
//
// DSOP_DOWNLEVEL_FILTER_EXCLUDE_BUILTIN_GROUPS
//     Exclude local builtin groups returned by groups enumeration.
//
// DSOP_DOWNLEVEL_FILTER_TERMINAL_SERVER
//     Include builtin security principal Terminal Server.
//
// DSOP_DOWNLEVEL_FILTER_LOCAL_SERVICE
//     Include builtin security principal Local Service
//
// DSOP_DOWNLEVEL_FILTER_NETWORK_SERVICE
//     Include builtin security principal Network Service
//
// DSOP_DOWNLEVEL_FILTER_ALL_WELLKNOWN_SIDS
//     Include all builtin security principals.
//

const
  DSOP_DOWNLEVEL_FILTER_USERS                  = $80000001;
  DSOP_DOWNLEVEL_FILTER_LOCAL_GROUPS           = $80000002;
  DSOP_DOWNLEVEL_FILTER_GLOBAL_GROUPS          = $80000004;
  DSOP_DOWNLEVEL_FILTER_COMPUTERS              = $80000008;
  DSOP_DOWNLEVEL_FILTER_WORLD                  = $80000010;
  DSOP_DOWNLEVEL_FILTER_AUTHENTICATED_USER     = $80000020;
  DSOP_DOWNLEVEL_FILTER_ANONYMOUS              = $80000040;
  DSOP_DOWNLEVEL_FILTER_BATCH                  = $80000080;
  DSOP_DOWNLEVEL_FILTER_CREATOR_OWNER          = $80000100;
  DSOP_DOWNLEVEL_FILTER_CREATOR_GROUP          = $80000200;
  DSOP_DOWNLEVEL_FILTER_DIALUP                 = $80000400;
  DSOP_DOWNLEVEL_FILTER_INTERACTIVE            = $80000800;
  DSOP_DOWNLEVEL_FILTER_NETWORK                = $80001000;
  DSOP_DOWNLEVEL_FILTER_SERVICE                = $80002000;
  DSOP_DOWNLEVEL_FILTER_SYSTEM                 = $80004000;
  DSOP_DOWNLEVEL_FILTER_EXCLUDE_BUILTIN_GROUPS = $80008000;
  DSOP_DOWNLEVEL_FILTER_TERMINAL_SERVER        = $80010000;
  DSOP_DOWNLEVEL_FILTER_ALL_WELLKNOWN_SIDS     = $80020000;
  DSOP_DOWNLEVEL_FILTER_LOCAL_SERVICE          = $80040000;
  DSOP_DOWNLEVEL_FILTER_NETWORK_SERVICE        = $80080000;
  DSOP_DOWNLEVEL_FILTER_REMOTE_LOGON           = $80100000;


//
// DSOP_UPLEVEL_FILTER_FLAGS
// =========================
//
// Contains the DSOP_FILTER_* flags for use with a DSOP_SCOPE_INIT_INFO
// structure when the scope is uplevel (DS-aware).
//
// flBothModes
//     Flags to use for an uplevel scope, regardless of whether it is a
//     mixed or native mode domain.
//
// flMixedModeOnly
//     Flags to use when an uplevel domain is in mixed mode.
//
// flNativeModeOnly
//     Flags to use when an uplevel domain is in native mode.
//
//
// DSOP_FILTER_FLAGS
// =================
//
// Uplevel
//     Contains flags to use for an uplevel scope.
//
// flDownlevel
//     Flags to use for a downlevel scope.
//

type
  PDSOPUplevelFilterFlags = ^TDSOPUplevelFilterFlags;
  _DSOP_UPLEVEL_FILTER_FLAGS = record
    flBothModes     : ULONG;
    flMixedModeOnly : ULONG;
    flNativeModeOnly: ULONG;
  end;
  TDSOPUplevelFilterFlags = _DSOP_UPLEVEL_FILTER_FLAGS;
  DSOP_UPLEVEL_FILTER_FLAGS = _DSOP_UPLEVEL_FILTER_FLAGS;

type
  PDSOPFilterFlags = ^TDSOPFilterFlags;
  _DSOP_FILTER_FLAGS = record
    Uplevel    : TDSOPUplevelFilterFlags;
    flDownlevel: ULONG;
  end;
  TDSOPFilterFlags = _DSOP_FILTER_FLAGS;
  DSOP_FILTER_FLAGS = _DSOP_FILTER_FLAGS;


//
// DSOP_SCOPE_INIT_INFO
// ====================
//
// Each DSOP_SCOPE_INIT_INFO structure in the array DSOP_INIT_INFO.aDsScopeInfos
// describes a single scope or a group of scopes with the same settings.
//
// cbSize
//     Size, in bytes, of the entire structure.
//
// flType
//     DSOP_SCOPE_TYPE_* flags.  It is legal to combine multiple values via
//     bitwise OR if all of the types of scopes combined in this way require
//     the same settings.
//
// flScope
//     DSOP_SCOPE_ * flags.
//
// FilterFlags
//     DSOP_FILTER_* flags that indicate which types of objects should be
//     presented to the user in this scope.
//
// pwzDcName
//     Name of the DC of a domain.  This member is used only if the flType
//     member contains the flag DSOP_SCOPE_TYPE_JOINED_DOMAIN.  If that flag is
//     not set, this member must be NULL.
//
// pwzADsPath
//     Currently not supported, must be NULL.
//
// hr
//     Filled with S_OK if the scope represented by this structure could be
//     created, or an error message indicating why it could not.  If
//     IDsObjectPicker::SetScopes returns a success code, this value will
//     also be a success code.
//

type
  PDSOPScopeInitInfo = ^TDSOPScopeInitInfo;
  PDSOP_SCOPE_INIT_INFO = PDSOPScopeInitInfo;
  _DSOP_SCOPE_INIT_INFO = record
    cbSize     : ULONG;
    flType     : ULONG;
    flScope    : ULONG;
    FilterFlags: TDSOPFilterFlags;
    pwzDcName  : PCWSTR;  // OPTIONAL
    pwzADsPath : PCWSTR;  // OPTIONAL
    hr         : HRESULT;
  end;
  TDSOPScopeInitInfo = _DSOP_SCOPE_INIT_INFO;
  DSOP_SCOPE_INIT_INFO = _DSOP_SCOPE_INIT_INFO;

type
  PCDSOPScopeInitInfo = PDSOPScopeInitInfo;    // const;
  PCDSOP_SCOPE_INIT_INFO = PDSOPScopeInitInfo; // const;


//
// DSOP_INIT_INFO flags
// ====================
//
// The following flags may be set in DSOP_INIT_INFO.flOptions:
//
// DSOP_FLAG_MULTISELECT
//     Allow multiple selections.  If this flag is not set, the dialog will
//     return zero or one objects.
//
// DSOP_FLAG_SKIP_TARGET_COMPUTER_DC_CHECK
//     If this flag is NOT set, then the DSOP_SCOPE_TYPE_TARGET_COMPUTER flag
//     will be ignored if the target computer is a DC.  This flag has no effect
//     unless DSOP_SCOPE_TYPE_TARGET_COMPUTER is specified.
//

const
  DSOP_FLAG_MULTISELECT                   = $00000001;
  DSOP_FLAG_SKIP_TARGET_COMPUTER_DC_CHECK = $00000002;

//
// DSOP_INIT_INFO
// ==============
//
// Used to configure the DS Object Picker dialog.
//
// cbSize
//     Size, in bytes, of entire structure.
//
// pwzTargetComputer
//     Sets the computer associated with DSOP_SCOPE_TARGET_COMPUTER, and
//     which is used to determine the joined domain and enterprise.
//     If this value is NULL, the target computer is the local machine.
//
// cDsScopeInfos
//     Count of elements in aDsScopeInfos.  Must be at least 1, since
//     the object picker cannot operate without at least one scope.
//
// aDsScopeInfos
//     Array of scope initialization structures.  Must be present and
//     contain at least one element.
//
// flOptions
//     Various DS Object Picker flags (DSOP_FLAG_MULTISELECT).
//
// cAttributesToFetch
//     Count of elements in apwzAttributeNames.  Can be 0.
//
// apwzAttributeNames
//     Array of names of attributes to fetch for each object.  Ignored
//     if cAttributesToFetch is 0.
//

type
  PDSOPInitInfo = ^TDSOPInitInfo;
  PDSOP_INIT_INFO = PDSOPInitInfo;
  _DSOP_INIT_INFO = record
    cbSize            : ULONG;
    pwzTargetComputer : PCWSTR;
    cDsScopeInfos     : ULONG;
    aDsScopeInfos     : PDSOPScopeInitInfo;
    flOptions         : ULONG;
    cAttributesToFetch: ULONG;
    apwzAttributeNames: ^PCWSTR;
  end;
  TDSOPInitInfo = _DSOP_INIT_INFO;
  DSOP_INIT_INFO = _DSOP_INIT_INFO;

type
  PCDSOP_INIT_INFO = PDSOPInitInfo;  // const


//
// DS_SELECTION
// ============
// Describes an object selected by the user.
//
// pwzName
//     The object's RDN.
//
// pwzADsPath
//     The object's ADsPath.
//
// pwzClass
//     The object's class attribute value.
//
// pwzUPN
//     The object's userPrincipalName attribute value.
//
// pvarFetchedAttributes
//     An array of VARIANTs, one for each attribute fetched.
//
// flScopeType
//     A single DSOP_SCOPE_TYPE_* flag describing the type of the scope
//     from which this object was selected.
//
//
// DS_SELECTION_LIST
// =================
// Available as a clipboard format from the data object returned by
// IDsObjectPicker::InvokeDialog.  Contains a list of objects that the user
// selected.
//
// cItems
//     Number of elements in the aDsSelection array.
//
// cFetchedAttributes
//     Number of elements in each DSSELECTION.avarFetchedAttributes member.
//
// aDsSelection
//     Array of cItems DSSELECTION structures.
//

type
  PDSSelection = ^TDSSelection;
  PDS_SELECTION = PDSSelection;
  _DS_SELECTION = record
    pwzName              : PWSTR;
    pwzADsPath           : PWSTR;
    pwzClass             : PWSTR;
    pwzUPN               : PWSTR;
    pvarFetchedAttributes: PVariant;
    flScopeType          : ULONG;
  end;
  TDSSelection = _DS_SELECTION;
  DS_SELECTION = _DS_SELECTION;

type
  PDSSelectionList = ^TDSSelectionList;
  PDS_SELECTION_LIST = PDSSelectionList;
  _DS_SELECTION_LIST = record
    cItems            : ULONG;
    cFetchedAttributes: ULONG;
    aDsSelection      : array [0..0] of TDSSelection;
  end;
  TDSSelectionList = _DS_SELECTION_LIST;
  DS_SELECTION_LIST = _DS_SELECTION_LIST;

//
// Object Picker Interfaces
//

//
// The main interface to the DS Object Picker, used to initialize it,
// invoke the dialog, and return the user's selections.
//

type
  IDsObjectPicker = interface(IUnknown)
    ['{17D6CCD8-3B7B-11D2-B9E0-00C04FD8DBF7}']
    function Initialize(var pInitInfo: TDSOPInitInfo): HRESULT; stdcall;
    function InvokeDialog(hwndParent: HWND; out ppdoSelections: IDataObject): HRESULT; stdcall;
  end;

implementation

end.


